﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Elements
{
    //说明，为了方便管理，及扩展性的演示，此处放到了单独的DLL中。这样以后只需要在这个独立的DLL中添加新形状就行了。
    //注：文章中说明，可用interface，但是很多时候要提供默认实现，所以用abstract比较好，【可以让AI给总结下】

    /// <summary>
    /// 形状基类
    /// </summary>
    public abstract class ShapeBase
    {
        /// <summary>
        /// 形状ID
        /// </summary>
        public string Id { get; set; }
        /// <summary>
        /// 形状位置和尺寸
        /// </summary>
        public Rectangle Rect { get; set; }
        /// <summary>
        /// 背景颜色
        /// </summary>
        public Color BackgroundColor { get; set; }
        /// <summary>
        /// 形状内的文本
        /// </summary>
        public string Text { get; set; }
        /// <summary>
        /// 文本字体
        /// </summary>
        public Font TextFont { get; set; }
        /// <summary>
        /// 文本颜色
        /// </summary>
        public Color FontColor { get; set; }

        //注：文章中说明，为了扩展性，不可能都在一个类中，不可能添加一个形状或连线就改代码，所以要把绘制方法放到基类中，由各个派生形状和连线自行绘制。
        /// <summary>
        /// 绘制形状
        /// </summary>
        /// <param name="g"></param>
        public abstract void Draw(Graphics g);

        /// <summary>
        /// 获取形状的中心点
        /// </summary>
        /// <param name="shapeId"></param>
        /// <returns></returns>
        public virtual Point GetCentertPoint()
        {
            var line1X = Rect.X + Rect.Width / 2;
            var line1Y = Rect.Y + Rect.Height / 2;
            return new Point(line1X, line1Y);
        }
    }
}
